// 知识点1：管理类外资源的类必须定义拷贝控制成员

// 知识点2：为了定义拷贝控制成员，我们可以定义拷贝操作，使得类的行为看起来像是一个值或者一个指针

// 知识点3：类的行为像一个值，拷贝发生时，副本和原对象是完全独立的，改变副本不会对原对象产生影响

// 知识点4：类的行为像一个指针，拷贝发生时，副本和原对象共用底层数据，改变副本也会改变原对象

// 知识点5：标准库容器和string类就是像值的类，shared_ptr类就是像指针的类，IO类和unique_ptr不允许拷贝和赋值，所以都不是
// #include <string>
// using namespace std;
// class Hasptr {
// public:
//   Hasptr(); //默认构造函数

//拷贝构造函数，完成string 指针指向内容的拷贝和i值的拷贝
//   Hasptr(const Hasptr &p) : ps(new string(*p.ps)), i(p.i) {}

//   拷贝赋值运算符
//   Hasptr &operator=(const Hasptr &p) {
//     auto new_ps = new string(p.ps);
//     delete ps;
//     ps = new_ps;
//     return *this;
//   }

//   析构函数
//   ~Hasptr() { delete ps; }

// private:
//   string *ps;
//   int i;
// };